'''文件操作'''
import os

# "r"只读
# "w"只写
# "a"追加
# "rb"以二进制的形式进行只读
# "wb"以二进制的形式进行只写
# "ab"以二进制的形式进行追加
# f = open("1.txt","r",encoding="utf-8")
# f.read()#读，全部读出来
# f.read(1)# 每次读固定的
# f.write("1234")#写
# f.close()#关闭文件
# f.seek()#指针的操作
# f.readline()#读出一行
# f.readlines()#所有的行以列表的形式返回
# 说明：对于较大的文件禁止使用 read readline readlines 遵循的思路是一点一点的读

# IO: input output
# 读：内存从文件中去读，文件的内容进入了内存。入 input
# 写：从内存中写到文件，内容从内存出到了文件。出 output

# f = open("ooo.txt","r",encoding="utf-8")
#
# print(f.read())
# print(f.read(1))
# # f.write("是的")
# f.close()

# with open("ooo.txt","r",encoding="utf-8") as f1:
#     s = f1.read()
#
# with open("ooo1.txt","w",encoding="utf-8") as f2:
#     f2.write(s)
# f1.close()
# f2.close()

'''文件的复制2，当文件比较大时，一点一点的读，一点一点地写'''
# with open("ooo.txt","r",encoding="utf-8") as f1,open("ooo1.txt","w",encoding="utf-8") as f2:
#     while True:
#         str = f1.read(20)
#         if len(str) == 0:
#             break
#         f2.write(str)

# 位：二进制的0或1，就占一位
# 字节：一个字节占8位，普通的一个英文字母就是一个字节，汉字是两个字节
# 字符：汉字、字母、数字、符号就是一个字符



'''文件操作seek'''
# with open("ooo.txt","r",encoding="utf-8") as f:
#     print(f.read(1))
#     f.seek(6)
#     print(f.read(1))


'''os'''
#工具箱，完成对于系统的一些操作
# os.rename("旧文件","新文件")重命名
# os.remove("")删除
# os.mkdir("")创建文件夹
# os.rmdir("")删除文件夹
# os.listdir("")展示出路径下的文件
# os.getcwd()获取当前操作路径
# os.chdir()设置默认操作路径

# import os
# print(os.getcwd())
# #修改默认的操作路径os.chdir()
#
# #得到该路径下所有的文件os.listdir
# for file_name in os.listdir():
#     index = file_name.index("]")+1
#     new_file_name = "[11]"+file_name[index:]
#     os.rename(file_name, new_file_name)

#读取某一个包下所有的.py文件，将里面的所有的不以#开头的内容，打印出来
# #os.chdir() 设置默认操作路径
# import os
# os.chdir('D:\\Users\\Python\\PycharmProjects\\PythonProject1\\pythonproject01')
# for file_name in os.listdir():#外出循环：得到每一个文件
#     if file_name.endswith('.py'):
#         with open(file_name, 'r', encoding='utf-8') as f:
#             while True:#內部循环：读出一个文件的每一行
#                 current_line = f.readline()
#                 if len(current_line) == 0:
#                     break
#                 if current_line.lstrip().startswith('#')==False:
#                     print(current_line)
#             print("~~~~~~~~~~~~~~~~~~~~~~")



'''迭代器iterator'''
#通过函数iter（可迭代对象）这个函数，得到的对象就是一个迭代器对象
#迭代器可以通过next（it）得到可迭代对象的下一数据，直到所有数据迭代完成，抛出StopIteration错误异常
# 作用：更符合面向对象的思想，可以得到可迭代对象中的下一条记录

# L = ["1","2","3","4"]
# it = iter(L)
# print(next(it))
# print(next(it))
# print(next(it))
# print(next(it))
# print(next(it))

# while True:
#     try:
#         print(next(it))
#     except StopIteration:
#         break

# s = {1,2,77,4,5,6,7,8,9}
# it = iter(s)
# while True:
#     try:
#         print(next(it))
#     except StopIteration:
#         break

# for i in s:
#     print(i)



'''生成器 generator'''
# 生成器是能 动态 的提供数据的对象，生成器对象是一个可迭代的对象
# 生成器有两种：
#     生成器函数：在函数中有关键字 yield，此函数被调用的时候就会返回一个生成器
#     生成器表达式：(表达式 for in 可迭代对象 [if 真值表达式])

# 生成器函数返回生成器对象
# 生成器对象是可迭代的
# 在生成器函数中，会默认的使用StopIteration来触发异常，作为通知，告诉调用者，生成结束，


# 总结：迭代器、生成器都是去迭代对象的数据的方式，生成器比较节省内存


'''生成器函数'''
# def myfun():
#     print("正在生成1")
#     yield 1
#     yield 2
#     yield 3
#     print("结束了")
#
# gen = myfun()#这个函数的返回就是一个生成器对象，这个对象是可迭代的
# it = iter(myfun())#使用这个可迭代对象，创建出一个迭代器对象
# print(next(it))
# print(next(it))
# print(next(it))
# print(next(it))

#
# def myfun_int():
#   for i in range(1,101):
#       if i % 2 == 0:
#           yield i
#
# def myfun_odd():
#     for i in range(1,101):
#         if i % 2 != 0:
#             yield i

# gen = myfun_int()
# it = iter(gen)
# while True:
#     print(next(it))

# gen = myfun_odd()
# it = iter(gen)
# while True:
#     print(next(it))

# for i in myfun_int():#一边循环，一边生成
#     print(i)
#
# for i in list(myfun_odd()):#全部遍历完再生成
#     print(i)



'''生成器推导式'''
# gen = (x**2 for x in range(1,4))
# print(next(gen))
# print(next(gen))
# print(next(gen))
# print(next(gen))#StopIteration

# L = [1, 2, 3, 4, 5]
# gen1 = (x for x in L)#生成器在调用一次的时候才生成一次
# lst = [x for x in L]#列表使用全部生成
# L[2]= 222222
# for i in gen1:#1 222222 3 4 5
#     print(i)
# print("~~~~~~~~~~~~~~~~~~~")
# for i in lst:#1 2 3 4 5
#     print(i)



'''迭代工具函数:zip'''
# 迭代工具函数 可以 迭代 有个性化需求的数据
# zip(iter[,iter,iter...]),返回一个zip类型对象,在python3版本中,这个对象可以转换成列表

# a = [1, 2, 3]
# b = [4, 5, 6,7,8,9]
# c = [10,11,123,51,16,71,42]
# zipped1 =zip(a)
# print(type(zipped1))
# print(list(zipped1))#((1,), (2,), (3,))转化成列表,列表中的是元组
# zipped2 = zip(a,b)
# print(list(zipped2))
# zipped3 = zip(a,b,c)
# print(list(zipped3))

# num = ["10086","10000","10010","10011","95588"]
# name = ["中国移动","中国电信","中国联通","中国铁通"]
# # zipped1 = zip(num)
# print(list(zipped1))
# zipped2 = zip(name)
# print(tuple(zipped2))
# zipped3 = zip(num,name)
# print(list(zipped3))

# def myzip(iter1, iter2):
#     it1 = iter(iter1)
#     it2 = iter(iter2)
#     while True:
#         try:
#             a=next(it1)
#             b=next(it2)
#             yield(a,b)
#         except StopIteration:
#             break
# n = myzip(num,name)
# for i in n:#每次循环会自动调用next(n),并将结果赋值给i
#     print(i)





'''迭代工具函数:enumerate'''
# 它接受两个参数：可迭代对象和起始索引值:enumerate(迭代元素,起始索引值)
# 它会生成一个迭代器，每次产生一个 (索引, 元素) 元组

# 写一个程序，可以读取多行的控制台的数据，当用户输入的数据为空时,就输出:
# 第1行数据:XXXX
# 第2行数据:xxxx
# 第3行数据:XXXX
# L = []
# while True:
#     s = input("请输入数据:")
#     if not s:
#         break
#     L.append(s)
# # print(L)
#
#
# for num,text in enumerate(L,1):
#     print("第",num,"行","是",text)